home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / LGP250S1.ZIP / src / libgplus.5 / libgplus / tests / tbitstri.cc < prev    next >
C/C++ Source or Header  |  1993-06-06  |  8KB  |  324 lines

  1. /*
  2.  a test/demo of BitStrings
  3. */
  4.  
  5. #include <assert.h>
  6. #define tassert(ex) { cerr << #ex; \
  7.                        if ((ex)) cerr << " OK\n"; \
  8.                        else cerr << " Fail\n"; }
  9.  
  10.  
  11. #include <BitString.h>
  12.  
  13. void doubletest(BitString a)
  14. {
  15.   BitString x;
  16.   BitString y;
  17.   x = a + reverse(a);
  18.   for (int i = 0; i < 7; ++i)
  19.   {
  20.     y = x;
  21.     x += x;
  22.     assert(x == reverse(x));
  23.     assert(x.index(y) == 0);
  24.     assert(x.index(y, -1) == x.length() / 2);
  25.     assert(x.OK());
  26.   }
  27. }
  28.  
  29. // identities for equal-length args
  30.  
  31. void identitytest(BitString a, BitString b, BitString c)
  32. {
  33. // neg
  34.   assert(~(~a) == a);
  35. // commutative
  36.   assert((a | b) ==  (b | a));
  37.   assert((a & b) ==  (b & a));
  38. // associative
  39.   assert((a | (b | c)) == ((a | b) | c));
  40.   assert((a & (b & c)) == ((a & b) & c));
  41. // distrib
  42.   assert((a & (b | c)) == ((a & b) | (a & c)));
  43.   assert((a | (b & c)) == ((a | b) & (a | c)));
  44. // absorption
  45.   assert((a & (a | b)) == a);
  46.   assert((a | (a & b)) == a);
  47. // demorgan
  48.   assert((a | b) == ~(~a & ~b));
  49.   assert((a & b) == ~(~a | ~b));
  50. // def of -
  51.   assert((a - b) == (a & ~b));
  52.   assert(((a - b) | b) == (a | b));
  53. // def of disjoint union
  54.   assert((a ^ b) == ((a | b) & ~(a & b)));
  55.   assert((a ^ b) == ((a - b) | (b - a)));
  56. // shift
  57.   assert(((a << 1) >> 1) == a);
  58. // concat
  59.   assert((a + (b + c)) == ((a + b) + c));
  60.  
  61.   BitString x;
  62.   x = a + b;
  63.   assert(x.after(a) == b);
  64.   assert(x.before(b, -1) == a);
  65.  
  66.   x = a;
  67.   int l = x.length();
  68.   x.set(l);
  69.   assert(x == (a + 1));
  70.   x.clear(l);
  71.   assert(x == (a + 0));
  72. }
  73.  
  74. void accumtest(BitString& a, BitString& b, BitString& c)
  75. {
  76.   BitString x = a;
  77.   x &= b;
  78.   assert(x == (a & b));
  79.   x |= c;
  80.   assert(x == ((a & b) | c));
  81.   x -= a;
  82.   assert(x == (((a & b) | c) - a));
  83.   x ^= b;
  84.   assert(x == ((((a & b) | c) - a) ^ b));
  85.   x += c;
  86.   assert(x == (((((a & b) | c) - a) ^ b) + c));
  87.   x <<= 7;
  88.   assert(x == ((((((a & b) | c) - a) ^ b) + c) << 7));
  89.   x >>= 5;
  90.   assert(x == (((((((a & b) | c) - a) ^ b) + c) << 7) >> 5));
  91.   x += 0;
  92.   assert(x == ((((((((a & b) | c) - a) ^ b) + c) << 7) >> 5) + 0));
  93.  
  94.   assert(x.OK());
  95. }
  96.  
  97.  
  98. void cmptest(BitString& x)
  99. {
  100.   BitString a = x;
  101.   a[0] = 0;
  102.   BitString b = a;
  103.  
  104.   assert(a == b);
  105.   assert(a <= b);
  106.   assert(a >= b);
  107.   assert(!(a != b));
  108.   assert(!(a > b));
  109.   assert(!(a < b));
  110.   assert(lcompare(a, b) == 0);
  111.   assert(a.matches(b));
  112.   assert(a.contains(b));
  113.  
  114.   b[0] = 1;
  115.   cout << "b.set(0)       :" << b << "\n";
  116.  
  117.   assert(!(a == b));
  118.   assert(!(a >= b));
  119.   assert(!(a > b));
  120.   assert((a != b));
  121.   assert(a <= b);
  122.   assert((a < b));
  123.   assert(lcompare(a, b) < 0);
  124.   assert(!a.matches(b));
  125.   assert(!a.contains(b));
  126.   assert(a.after(0) == b.after(0));
  127.  
  128.   b.set(65);
  129.   cout << "b.set(65):\n" << b << "\n";
  130.   assert(b[65] == 1);
  131.   assert(b[64] == 0);
  132.   assert(b.length() == 66);
  133.   b.clear(2);
  134.   cout << "b.clear(2):\n" << b << "\n";
  135.   assert(b[2] == 0);
  136.   b.set(11);
  137.   b.invert(11,20);
  138.   cout << "b.invert(11,20):\n" << b << "\n";
  139.   assert(b[11] == 0);
  140.   b.set(21,30);
  141.   cout << "b.set(21,30):\n" << b << "\n";
  142.   assert(b[21] == 1);
  143.   b.clear(31,40);
  144.   cout << "b.clear(31, 40):\n" << b << "\n";
  145.   assert(b.test(33, 38) == 0);
  146. }
  147.  
  148. void subtest(BitString c)
  149. {
  150.   BitString k = c.at(1, 4);
  151.   cout << "k = " << k << "\n";
  152.   assert(c.index(k) == 1);
  153.   assert(c.index(k, -1) != -1);
  154.   
  155.   cout << "c.before(k) = " << c.before(k) << "\n";
  156.   assert(c.before(k) == c.before(1));
  157.   cout << "c.at(k)     = " <<  c.at(k) << "\n";
  158.   assert(c.at(k) == k);
  159.   cout << "c.after(k)  = " << c.after(k) << "\n";
  160.   assert(c.after(k) == c.after(4));
  161.   c.after(k) = k;
  162.   cout << "c.after(k)=k :" << c << "\n";
  163.   assert(c.after(4) == k);
  164.   c.before(k) = k;
  165.   cout << "c.before(k)=k:" << c << "\n";
  166.   assert(c.after(c.after(k)) == k);
  167.   
  168.   assert(c.contains(k, 0));
  169.   assert(common_prefix(c, k) == k);
  170.   assert(common_suffix(c, k) == k);
  171.   cout << "reverse(k)           = " << reverse(k) << "\n";
  172.   k.left_trim(0);
  173.   assert(k[0] == 1);
  174.   cout << "k.left_trim(0)       : " << k << "\n";
  175.   k.right_trim(1);
  176.   assert(k[k.length() - 1] == 0);
  177.   cout << "k.right_trim(1)      : " << k << "\n";
  178. }
  179.  
  180. int main()
  181. {
  182.   BitString a;
  183.   BitString b = atoBitString("1000000001");
  184.   BitString c = atoBitString("10101010101010101010");
  185.   BitString d = atoBitString("00110011001100110011");
  186.   BitString e = atoBitString("11110000111100001111");
  187.   BitString f = b;
  188.   BitString g = ~e;
  189.   BitString h = d;
  190.  
  191.   assert(a.OK());
  192.   assert(a.empty());
  193.   assert(b.OK());
  194.   assert(!b.empty());
  195.   assert(c.OK());
  196.   assert(c.count(1) == 10);
  197.   assert(c.count(0) == 10);
  198.   assert(d.OK());
  199.   assert(c.count(1) == 10);
  200.   assert(c.count(0) == 10);
  201.   assert(e.OK());
  202.   assert(e.count(1) == 12);
  203.   assert(e.count(0) == 8);
  204.   assert(f == b);
  205.   assert(h == d);
  206.   assert(g == ~e);
  207.   assert(~g == e);
  208.   assert(f.OK());
  209.   assert(g.OK());
  210.   assert(h.OK());
  211.  
  212.   cout << "a      = " << a << "\n";
  213.   cout << "b      = " << b << "\n";
  214.   cout << "c      = " << c << "\n";
  215.   cout << "d      = " << d << "\n";
  216.   cout << "e      = " << e << "\n";
  217.   cout << "f = b  = " << f << "\n";
  218.   cout << "g = ~e = " << g << "\n";
  219.   cout << "h = d  = " << h << "\n";
  220.  
  221.   for (int i = 0; i < 20; ++i)
  222.   {
  223.     assert(h[i] == d[i]);
  224.     assert(g[i] != e[i]);
  225.     assert(c[i] == !(i % 2));
  226.   }
  227.  
  228.   cout << "bits in e:\n";
  229.   for (int p = e.first(); p >= 0; p = e.next(p)) 
  230.   {
  231.     assert(e[p] == 1);
  232.     cout << p << " ";
  233.   }
  234.   cout << "\n";
  235.  
  236.   cout << "clear bits in g (reverse order):\n";
  237.   for (p = g.last(0); p >= 0; p = g.prev(p, 0)) 
  238.   {
  239.     assert(g[p] == 0);
  240.     cout << p << " ";
  241.   }
  242.   cout << "\n";
  243.  
  244.   cout << "~c     = " << (~c) << "\n";
  245.   cout << "c & d  = " << (c & d) << "\n";
  246.   cout << "c | d  = " << (c | d) << "\n";
  247.   cout << "c - d  = " << (c - d) << "\n";
  248.   cout << "c ^ d  = " << (c ^ d) << "\n";
  249.   cout << "c + d  = " << (c + d) << "\n";
  250.   cout << "c <<2  = " << (c << 2) << "\n";
  251.   cout << "c >>2  = " << (c >> 2) << "\n";
  252.  
  253.   f &= c;
  254.   cout << "f &= c = " << f << "\n";
  255.   f |= d;
  256.   cout << "f |= d = " << f << "\n";
  257.   f -= d;
  258.   cout << "f -= e = " << f << "\n";
  259.   f ^= c;
  260.   cout << "f ^= c = " << f << "\n";
  261.   f += b;
  262.   cout << "f += b = " << f << "\n";
  263.   f <<= 5;
  264.   cout << "f <<=5 = " << f << "\n";
  265.   f >>= 10;
  266.   cout << "f >>=10= " << f << "\n";
  267.  
  268.   assert(c != d);
  269.   assert(!(c == d));
  270.   assert(!(c < d));
  271.   assert(!(c > d));
  272.   assert(!(c <= d));
  273.   assert(!(c >= d));
  274.   assert(lcompare(c, d) > 0);
  275.  
  276.  
  277.   BitString l = c + d + c;
  278.   cout << "l = " << l << "\n";
  279.   BitPattern pat(d, e);
  280.   assert(pat.OK());
  281.   cout << "BitPattern pat = " << pat << "\n";
  282.   cout << "pat.pattern    = " << pat.pattern << "\n";
  283.   cout << "pat.mask       = " << pat.mask << "\n";
  284.   assert(d.matches(pat));
  285.   cout << "l.index(pat)   = " << l.index(pat) << "\n";
  286.   cout << "l.index(pat,-1)= " << l.index(pat, -1) << "\n";
  287.   cout << "l.before(pat)  = " << l.before(pat) << "\n";
  288.   cout << "l.at(pat)      = " << l.at(pat) << "\n";
  289.   cout << "l.after(pat)   = " << l.after(pat) << "\n";
  290.   int eind = l.index(pat);
  291.   l.at(pat) = e;
  292.   assert(l.index(e) == eind);
  293.  
  294.   identitytest(d, g, h);
  295.   identitytest(a, a, a);
  296.   identitytest(c, d, e);
  297.   identitytest(e, d, c);
  298.   identitytest(longtoBitString(0), longtoBitString((unsigned)(~(0L))), 
  299.                shorttoBitString(1025));
  300.   identitytest(a+b+c+d+e+f+g+h, h+g+f+e+d+c+b+a, a+c+e+g+b+d+f+h);
  301.  
  302.   accumtest(d, g, h);
  303.   accumtest(a, b, c);
  304.   accumtest(c, d, e);
  305.   accumtest(e, d, c);
  306.   accumtest(a+b+c+d+e+f+g+h+l, f+e+d+c+b+a+pat.mask, e+g+b+d+f+h+pat.pattern);
  307.  
  308.   doubletest(a);
  309.   doubletest(b);
  310.   doubletest(c);
  311.   doubletest(a+b+c+d+e+f+g+h);
  312.  
  313.   cmptest(b);
  314.   cmptest(d);
  315.  
  316.   subtest(c);
  317.   subtest(d);
  318.  
  319.   cout << "\nEnd of test.\n";
  320.   return 0;
  321. }
  322.  
  323.  
  324.